import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.checkerframework.checker.nullness.qual.*;

// interface Dest<DA,DB,DC,DD,DE> {
// }
//
// interface Inter1<I1A,I1B,I1C,I1D,I1E> extends Dest<I1A, I1A, I1C, I1D, String> {}
//
// interface Inter2<I2A,I2B,I2C,I2D,I2E> extends Dest<I2D,I2E,I2C,I2D,I2E> {}
//
// class Source<SA,SB,SC,SD,SE> extends HashMap<SA,SB> implements Inter2<SA,SB,SB,SD,SE> {}

public class KeyForPropagation {

  {
    List<@KeyFor("a") String> a = new ArrayList<String>();
  }

  static {
    List<@KeyFor("b") String> b = new ArrayList<String>();
  }

  List<@KeyFor("c") String> c = new ArrayList<String>();

  void method() {
    List<@KeyFor("d") String> d = new ArrayList<String>();
  }

  void method(Map<String, String> v) {
    Set<String> ks = v.keySet();
  }
}
