internal ClusterNode(ClusterConfiguration configuration, string raw, EndPoint origin)
        {
            this.configuration = configuration;
            this.raw           = raw;
            var parts = raw.Split(StringSplits.Space);

            var flags = parts[2].Split(StringSplits.Comma);

            if (flags.Contains("myself"))
            {
                endpoint = origin;
            }
            else
            {
                endpoint = Format.TryParseEndPoint(parts[1]);
            }
            nodeId       = parts[0];
            isSlave      = flags.Contains("slave");
            parentNodeId = string.IsNullOrWhiteSpace(parts[3]) ? null : parts[3];

            List <SlotRange> slots = null;

            for (int i = 8; i < parts.Length; i++)
            {
                SlotRange range;
                if (SlotRange.TryParse(parts[i], out range))
                {
                    if (slots == null)
                    {
                        slots = new List <SlotRange>(parts.Length - i);
                    }
                    slots.Add(range);
                }
            }
            this.slots = slots == null ? NoSlots : slots.AsReadOnly();
        }