private static void EncodeNOfs(List <byte> bytes, List <CardCodeAndCount> nOfs)
        {
            foreach (CardCodeAndCount ccc in nOfs)
            {
                bytes.AddRange(Varint.GetVarint((ulong)ccc.Count));

                ParseCardCode(ccc.CardCode, out int setNumber, out string factionCode, out int cardNumber);
                int factionNumber = FactionCodeToIntIdentifier[factionCode];

                bytes.AddRange(Varint.GetVarint((ulong)setNumber));
                bytes.AddRange(Varint.GetVarint((ulong)factionNumber));
                bytes.AddRange(Varint.GetVarint((ulong)cardNumber));
            }
        }
        private static void EncodeGroupOf(List <byte> bytes, List <List <CardCodeAndCount> > groupOf)
        {
            bytes.AddRange(Varint.GetVarint((ulong)groupOf.Count));
            foreach (List <CardCodeAndCount> currentList in groupOf)
            {
                //how many cards in current group?
                bytes.AddRange(Varint.GetVarint((ulong)currentList.Count));

                //what is this group, as identified by a set and faction pair
                string currentCardCode = currentList[0].CardCode;
                ParseCardCode(currentCardCode, out int currentSetNumber, out string currentFactionCode, out int _);
                int currentFactionNumber = FactionCodeToIntIdentifier[currentFactionCode];
                bytes.AddRange(Varint.GetVarint((ulong)currentSetNumber));
                bytes.AddRange(Varint.GetVarint((ulong)currentFactionNumber));

                //what are the cards, as identified by the third section of card code only now, within this group?
                foreach (CardCodeAndCount cd in currentList)
                {
                    string code           = cd.CardCode;
                    int    sequenceNumber = int.Parse(code.Substring(4, 3));
                    bytes.AddRange(Varint.GetVarint((ulong)sequenceNumber));
                }
            }
        }