class IndividualSettingsValidator implements ConfigurationValidator {

    @Override
    public Map<String,String> validate( @Nonnull Config config, @Nonnull Log log ) throws InvalidSettingException
    {
        Map<String,String> rawConfig = config.getRaw();
        Map<String,String> validConfig = stringMap();
        for ( SettingValidator validator : settingValidators )
        {
            validConfig.putAll( validator.validate( rawConfig, log::warn ) );
        }

        final boolean strictValidation = config.get( strict_config_validation );

        rawConfig.forEach( ( key, value ) ->
        {
            if ( !validConfig.containsKey( key ) )
            {
                // Plugins rely on custom config options being present.
                // As a compromise, we only warn (and discard) for settings in our own "namespace"
                if ( reservedPrefixes.stream().anyMatch( key::startsWith ) )
                {
                    if ( warnOnUnknownSettings )
                    {
                        log.warn( "Unknown config option: %s", key );
                    }

                    if ( strictValidation )
                    {
                        throw new InvalidSettingException( String.format(
                                "Unknown config option '%s'. To resolve either remove it from your configuration " +
                                        "or set '%s' to false.", key, strict_config_validation.name() ) );
                    }
                    else
                    {
                        validConfig.put( key, value );
                    }
                }
                else
                {
                    validConfig.put( key, value );
                }
            }
        } );

        return Collections.emptyMap();
    }

      IndividualSettingsValidator( Collection<SettingValidator> settingValidators, boolean warnOnUnknownSettings );

}