public static int[] Slice_Flip_Prun = new int[CoordCube.N_SLICE1 * CoordCube.N_FLIP / 2]; // 495, 1024 = 506 880
    static Slice_Flip_PrunClass()
    {
        for (int i = 0; i < CoordCube.N_SLICE1 * CoordCube.N_FLIP / 2; i++)
        {
            Slice_Flip_Prun[i] = -1; //SHOULD BE -1 changed to 0
        }
        int depth = 0;

        CoordCube.setPruning(Slice_Flip_Prun, 0, 0);
        int done = 1;

        while (done != CoordCube.N_SLICE1 * CoordCube.N_FLIP)
        {
            for (int i = 0; i < CoordCube.N_SLICE1 * CoordCube.N_FLIP; i++)
            {
                int flip = i / CoordCube.N_SLICE1, slice = i % CoordCube.N_SLICE1;
                if (CoordCube.getPruning(Slice_Flip_Prun, i) == depth)
                {
                    for (int j = 0; j < 18; j++)
                    {
                        int newSlice = FRtoBRClass.FRtoBR_Move[slice * 24, j] / 24;
                        int newFlip  = FlipMoveClass.flipMove[flip, j];
                        if (CoordCube.getPruning(Slice_Flip_Prun, CoordCube.N_SLICE1 * newFlip + newSlice) == 0x0f)
                        {
                            CoordCube.setPruning(Slice_Flip_Prun, CoordCube.N_SLICE1 * newFlip + newSlice, (depth + 1));
                            done++;
                        }
                    }
                }
            }
            depth++;
        }
    }
    static Slice_Twist_PrunClass()
    {
        for (int i = 0; i < CoordCube.N_SLICE1 * CoordCube.N_TWIST / 2 + 1; i++)
        {
            Slice_Twist_Prun[i] = -1; // SHOULD BE -1 changed to 0
        }
        int depth = 0;

        CoordCube.setPruning(Slice_Twist_Prun, 0, 0);
        int done = 1;

        while (done != CoordCube.N_SLICE1 * CoordCube.N_TWIST)
        {
            for (int i = 0; i < CoordCube.N_SLICE1 * CoordCube.N_TWIST; i++)
            {
                int twist = i / CoordCube.N_SLICE1, slice = i % CoordCube.N_SLICE1;
                if (CoordCube.getPruning(Slice_Twist_Prun, i) == depth)
                {
                    for (int j = 0; j < 18; j++)
                    {
                        int newSlice = FRtoBRClass.FRtoBR_Move[slice * 24, j] / 24;
                        int newTwist = TwistMoveClass.twistMove[twist, j];
                        if (CoordCube.getPruning(Slice_Twist_Prun, CoordCube.N_SLICE1 * newTwist + newSlice) == 0x0f)
                        {
                            CoordCube.setPruning(Slice_Twist_Prun, CoordCube.N_SLICE1 * newTwist + newSlice, (depth + 1));
                            done++;
                        }
                    }
                }
            }
            depth++;
        }
    }
    static Slice_URtoDF_Parity_PrunClass()
    {
        for (int i = 0; i < CoordCube.N_SLICE2 * CoordCube.N_URtoDF * CoordCube.N_PARITY / 2; i++)
        {
            Slice_URtoDF_Parity_Prun[i] = -1;   //SHOULD BE -1 changed to 0
        }
        int depth = 0;

        CoordCube.setPruning(Slice_URtoDF_Parity_Prun, 0, 0);
        int done = 1;

        while (done != CoordCube.N_SLICE2 * CoordCube.N_URtoDF * CoordCube.N_PARITY)
        {
            for (int i = 0; i < CoordCube.N_SLICE2 * CoordCube.N_URtoDF * CoordCube.N_PARITY; i++)
            {
                int parity = i % 2;
                int URtoDF = (i / 2) / CoordCube.N_SLICE2;
                int slice  = (i / 2) % CoordCube.N_SLICE2;
                if (CoordCube.getPruning(Slice_URtoDF_Parity_Prun, i) == depth)
                {
                    for (int j = 0; j < 18; j++)
                    {
                        switch (j)
                        {
                        case 3:
                        case 5:
                        case 6:
                        case 8:
                        case 12:
                        case 14:
                        case 15:
                        case 17:
                            continue;

                        default:
                            int newSlice  = FRtoBRClass.FRtoBR_Move[slice, j];
                            int newURtoDF = URtoDFClass.URtoDF_Move[URtoDF, j];
                            int newParity = CoordCube.parityMove[parity, j];
                            if (CoordCube.getPruning(Slice_URtoDF_Parity_Prun, (CoordCube.N_SLICE2 * newURtoDF + newSlice) * 2 + newParity) == 0x0f)
                            {
                                CoordCube.setPruning(Slice_URtoDF_Parity_Prun, (CoordCube.N_SLICE2 * newURtoDF + newSlice) * 2 + newParity,
                                                     (depth + 1));
                                done++;
                            }
                            break;
                        }
                    }
                }
            }
            depth++;
        }
    }