protected internal override void Unmerge(ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode saveMode)
        {
            ConfigurationElementCollection source = (ConfigurationElementCollection)sourceElement;
            ConfigurationElementCollection parent = (ConfigurationElementCollection)parentElement;

            for (int n = 0; n < source.Count; n++)
            {
                ConfigurationElement sitem = source.BaseGet(n);
                object key = source.GetElementKey(sitem);
                ConfigurationElement pitem = parent != null?parent.BaseGet(key) as ConfigurationElement : null;

                ConfigurationElement nitem = CreateNewElementInternal(null);
                if (pitem != null && saveMode != ConfigurationSaveMode.Full)
                {
                    nitem.Unmerge(sitem, pitem, saveMode);
                    if (nitem.HasValues(pitem, saveMode))
                    {
                        BaseAdd(nitem);
                    }
                }
                else
                {
                    nitem.Unmerge(sitem, null, ConfigurationSaveMode.Full);
                    BaseAdd(nitem);
                }
            }

            if (saveMode == ConfigurationSaveMode.Full)
            {
                EmitClear = true;
            }
            else if (parent != null)
            {
                for (int n = 0; n < parent.Count; n++)
                {
                    ConfigurationElement pitem = parent.BaseGet(n);
                    object key = parent.GetElementKey(pitem);
                    if (source.IndexOfKey(key) == -1)
                    {
                        if (removed == null)
                        {
                            removed = new ArrayList();
                        }
                        removed.Add(pitem);
                    }
                }
            }
        }