class CaseInsensitiveMap<V> extends HashMap<String, V> {

    private static final long serialVersionUID = 1L;

    public CaseInsensitiveMap() {
    }

    public CaseInsensitiveMap(int initialCapacity) {
        super(initialCapacity);
    }

    public CaseInsensitiveMap(Map<? extends String, ? extends V> m) {
        this(m.size());
        putAll(m);
    }

    public CaseInsensitiveMap(Properties prop) {
        this(prop.size());
        putAll(prop);
    }

    @Override
    public V get(Object key) {
        return super.get(toUpper(key));
    }

    @Override
    public V put(String key, V value) {
        return super.put(toUpper(key), value);
    }

    @Override
    public void putAll(Map<? extends String, ? extends V> m) {
        for (Map.Entry<? extends String, ? extends V> e : m.entrySet()) {
            put(e.getKey(), e.getValue());
        }
    }

    @SuppressWarnings("unchecked")
    public void putAll(Properties prop) {<FILL_FUNCTION_BODY>}

    @Override
    public boolean containsKey(Object key) {
        return super.containsKey(toUpper(key));
    }

    @Override
    public V remove(Object key) {
        return super.remove(toUpper(key));
    }

    private static String toUpper(Object key) {
        return key == null ? null : StringUtils.toUpperEnglish(key.toString());
    }

    public void removeAll(Collection<?> c) {
        for (Object e : c) {
            remove(e);
        }
    }
}

        for (Entry<Object, Object> e : prop.entrySet()) {
            put(e.getKey().toString(), (V) e.getValue().toString());
        }
    
<methods>public void <init>() ,public void <init>(int) ,public void <init>(Map<? extends java.lang.String,? extends V>) ,public void <init>(int, float) ,public void clear() ,public java.lang.Object clone() ,public V compute(java.lang.String, BiFunction<? super java.lang.String,? super V,? extends V>) ,public V computeIfAbsent(java.lang.String, Function<? super java.lang.String,? extends V>) ,public V computeIfPresent(java.lang.String, BiFunction<? super java.lang.String,? super V,? extends V>) ,public boolean containsKey(java.lang.Object) ,public boolean containsValue(java.lang.Object) ,public Set<Entry<java.lang.String,V>> entrySet() ,public void forEach(BiConsumer<? super java.lang.String,? super V>) ,public V get(java.lang.Object) ,public V getOrDefault(java.lang.Object, V) ,public boolean isEmpty() ,public Set<java.lang.String> keySet() ,public V merge(java.lang.String, V, BiFunction<? super V,? super V,? extends V>) ,public V put(java.lang.String, V) ,public void putAll(Map<? extends java.lang.String,? extends V>) ,public V putIfAbsent(java.lang.String, V) ,public V remove(java.lang.Object) ,public boolean remove(java.lang.Object, java.lang.Object) ,public V replace(java.lang.String, V) ,public boolean replace(java.lang.String, V, V) ,public void replaceAll(BiFunction<? super java.lang.String,? super V,? extends V>) ,public int size() ,public Collection<V> values() <variables>static final int DEFAULT_INITIAL_CAPACITY,static final float DEFAULT_LOAD_FACTOR,static final int MAXIMUM_CAPACITY,static final int MIN_TREEIFY_CAPACITY,static final int TREEIFY_THRESHOLD,static final int UNTREEIFY_THRESHOLD,transient Set<Entry<java.lang.String,V>> entrySet,final float loadFactor,transient int modCount,private static final long serialVersionUID,transient int size,transient Node<java.lang.String,V>[] table,int threshold