protected override void AwakeTest()
        {
            var spaces = new ComplicatedWireSpace[this.TestModelWireSpaces.Length];

            for (int i = 0; i < spaces.Length; ++i)
            {
                spaces[i] = new ComplicatedWireSpace.TestSpace(this, this.TestModelWireSpaces[i]);
            }
            this.WireSpaces = Array.AsReadOnly(spaces);
        }
        protected override void AwakeLive()
        {
#if (!DEBUG)
            // We need to instantiate the entire module prefab to copy references between its children properly.
            using var wrapper = this.InstantiateComponent <VennWireComponent>();
            var vennSnippableWires = wrapper.Component.Wires;

            var componentVennWires = wrapper.Component.transform.Find("Component_VennWires");
            componentVennWires.SetParent(this.transform, false);

            // Oh god, Complicated Wires.
            // The two socket arrays are actually a single model, so inverting them is really tricky.
            // The solution used here is to make two copies of the model that each render one half
            // using a custom shader.
            var ledSocketRenderer = componentVennWires.Find("group1").GetComponent <MeshRenderer>();
            ledSocketRenderer.name = "LED Sockets";
            this.SocketMaterials[0].mainTexture = ledSocketRenderer.material.mainTexture;
            ledSocketRenderer.material          = this.SocketMaterials[0];

            var symbolSocketRenderer = Instantiate(ledSocketRenderer, ledSocketRenderer.transform.parent);
            symbolSocketRenderer.name           = "Symbol Sockets";
            this.SocketMaterials[1].mainTexture = symbolSocketRenderer.material.mainTexture;
            symbolSocketRenderer.material       = this.SocketMaterials[1];

            var childrenToKeep = (from Transform child in wrapper.Component.transform
                                  where child != componentVennWires && child.name != "StatusLightParent" &&
                                  child.name != "Component_PuzzleBackground" && child.name != "Component_Highlight"
                                  select child).ToList();
            foreach (var child in childrenToKeep)
            {
                child.SetParent(this.transform, false);
                if (child.name.StartsWith("LightGlow"))
                {
                    // We need to SetParent twice because the first call changes the object's world position.
                    // The second call needs to preserve the new world position.
                    child.SetParent(ledSocketRenderer.transform, true);
                }
            }

            // Reparent LED and symbol text objects so that they can be moved with the models.
            foreach (var child in componentVennWires.transform.Cast <Transform>().Where(t => t.name.StartsWith("LED_")).ToList())
            {
                child.parent = ledSocketRenderer.transform;
            }
            componentVennWires.transform.Find("Booleans").parent = symbolSocketRenderer.transform;

            // Shift the models around.
            ledSocketRenderer.transform.localPosition    = new Vector3(-0.018f, -0.009f, 0);
            ledSocketRenderer.transform.localScale       = new Vector3(1.218f, 1.623f, -1);
            symbolSocketRenderer.transform.localPosition = new Vector3(0.013f, 0.007f, 0);
            symbolSocketRenderer.transform.localScale    = new Vector3(0.82f, 0.582f, -1);

            var eventConnector = new WireEventConnector();
            eventConnector.WireCut += this.EventConnector_WireCut;
            foreach (var wire in vennSnippableWires)
            {
                eventConnector.Attach(wire);
            }

            var spaces = new ComplicatedWireSpace[vennSnippableWires.Length];
            for (int i = 0; i < vennSnippableWires.Length; ++i)
            {
                vennSnippableWires[i].WireIndex = i;
                spaces[i] = new ComplicatedWireSpace.LiveSpace(vennSnippableWires[i]);
            }
            this.WireSpaces = Array.AsReadOnly(spaces);
#endif
        }