@Override
 public String stringKey() {
   try {
     return String.format(WINDOW_FORMAT, CoderUtils.encodeToBase64(windowCoder, window));
   } catch (CoderException e) {
     throw new RuntimeException("Unable to generate string key from window " + window, e);
   }
 }
 @Override
 public String stringKey() {
   try {
     return String.format(
         WINDOW_AND_TRIGGER_FORMAT,
         CoderUtils.encodeToBase64(windowCoder, window),
         // Use base 36 so that can address 36 triggers in a single byte and still be human
         // readable.
         Integer.toString(triggerIndex, TRIGGER_RADIX).toUpperCase());
   } catch (CoderException e) {
     throw new RuntimeException("Unable to generate string key from window " + window, e);
   }
 }
 @Override
 public void appendTo(Appendable sb) throws IOException {
   sb.append('/').append(CoderUtils.encodeToBase64(windowCoder, window));
   sb.append('/').append(Integer.toString(triggerIndex, TRIGGER_RADIX).toUpperCase());
   sb.append('/');
 }
 @Override
 public void appendTo(Appendable sb) throws IOException {
   sb.append('/').append(CoderUtils.encodeToBase64(windowCoder, window)).append('/');
 }