public JObject Apply(JObject json)
        {
            var profileId = _manager.CreateNewProfile();
            var profile   = _manager.GetProfile(profileId);

            var loader    = new JsonConfigLoader();
            var finalizer = new JsonValueToEnum();

            json = loader.LoadConfig(json);
            json = finalizer.Apply(json);

            profile.SetProperties(json);
            profile.SetProperty("profile.name", "Profile 1");

            var visibleChannels = profile.GetProperty <List <int> >("behaviour.channel.visible");

            visibleChannels.Add((int)0x01FFFF /*GOBCHAT_INFO*/);
            visibleChannels.Add((int)0x02FFFF /*GOBCHAT_ERROR*/);
            profile.SetProperty("behaviour.channel.visible", visibleChannels);

            var result = new JObject();

            result["version"]       = 2;
            result["activeProfile"] = profileId;
            return(result);
        }
        public void Synchronize(JObject root)
        {
            if (!_writable)
            {
                throw new ConfigException("Config is read only");
            }

            var enumTransformer = new JsonValueToEnum();

            root = enumTransformer.Apply(root);

            var(changes, _)      = JsonUtil.RemoveUnused(root, _data, (path) => UnchangableValues.Contains(path));
            var(writeChanges, _) = JsonUtil.Overwrite(root, _data, (path) => UnchangableValues.Contains(path));

            changes.UnionWith(writeChanges);
            FirePropertyChange(changes, true);
        }