public void UpdateZoneTypes()
        {
            //This delay is needed due to a threading bug in OpenRGB
            //https://gitlab.com/CalcProgrammer1/OpenRGB/-/issues/376
            //https://gitlab.com/CalcProgrammer1/OpenRGB/-/issues/350
            Thread.Sleep(150);
            Stopwatch sw              = Stopwatch.StartNew();
            var       client          = new OpenRGBClient(name: "OpenRGB.NET Test: UpdateZoneTypes");
            var       controllerCount = client.GetControllerCount();
            var       devices         = new Device[controllerCount];

            for (int i = 0; i < controllerCount; i++)
            {
                devices[i] = client.GetControllerData(i);
            }

            for (int i = 0; i < controllerCount; i++)
            {
                var device = devices[i];

                for (int j = 0; j < device.Zones.Length; j++)
                {
                    var zone = device.Zones[j];
                    switch (zone.Type)
                    {
                    case Enums.ZoneType.Linear:
                        var colors = Color.GetHueRainbow((int)zone.LedCount);
                        client.UpdateZone(i, j, colors.ToArray());
                        break;

                    case Enums.ZoneType.Single:
                        client.UpdateZone(i, j, new[] { new Color(255, 0, 0) });
                        break;

                    case Enums.ZoneType.Matrix:
                        var yeet    = 2 * Math.PI / zone.MatrixMap.Width;
                        var rainbow = Color.GetHueRainbow((int)zone.MatrixMap.Width).ToArray();
                        //var rainbow = Color.GetSinRainbow((int)zone.MatrixMap.Width).ToArray();

                        var matrix = Enumerable.Range(0, (int)zone.LedCount).Select(_ => new Color()).ToArray();
                        for (int k = 0; k < zone.MatrixMap.Width; k++)
                        {
                            for (int l = 0; l < zone.MatrixMap.Height; l++)
                            {
                                var index = zone.MatrixMap.Matrix[l, k];
                                if (index != uint.MaxValue)
                                {
                                    matrix[index] = rainbow[k].Clone();
                                }
                            }
                        }
                        client.UpdateZone(i, j, matrix);
                        break;
                    }
                }
            }
            client.Dispose();
            sw.Stop();
            Output.WriteLine($"Time elapsed: {(double)sw.ElapsedTicks / Stopwatch.Frequency * 1000} ms.");
        }