// Path: xpra-common/src/main/java/xpra/client/XpraKeyboard.java
// public interface XpraKeyboard {
// 
//     Locale getLocale();
// 
//     List<KeyDesc> getKeycodes();
// 
//     /**
//      * Key descriptor.
//      */
//     class KeyDesc {
// 
//         int keyval;
//         String keyname = "";
//         int keycode;
//         int group;
//         int level;
// 
//         public KeyDesc(int keycode, String keyname) {
//             this.keyval = keycode;
//             this.keycode = keycode;
//             this.keyname = keyname;
//         }
// 
//         public List<Object> toList() {
//             final List<Object> list = new ArrayList<>(5);
//             list.add(keyval);
//             list.add(keyname);
//             list.add(keycode);
//             list.add(group);
//             list.add(level);
//             return list;
//         }
// 
//         @Override
//         public String toString() {
//             return getClass().getSimpleName() + "( " + keycode + ", " + keyname + ")";
//         }
//     }
// }
// 
// Path: xpra-common/src/main/java/xpra/client/XpraKeyboard.java
// class KeyDesc {
// 
//     int keyval;
//     String keyname = "";
//     int keycode;
//     int group;
//     int level;
// 
//     public KeyDesc(int keycode, String keyname) {
//         this.keyval = keycode;
//         this.keycode = keycode;
//         this.keyname = keyname;
//     }
// 
//     public List<Object> toList() {
//         final List<Object> list = new ArrayList<>(5);
//         list.add(keyval);
//         list.add(keyname);
//         list.add(keycode);
//         list.add(group);
//         list.add(level);
//         return list;
//     }
// 
//     @Override
//     public String toString() {
//         return getClass().getSimpleName() + "( " + keycode + ", " + keyname + ")";
//     }
// }
// 
// Path: xpra-common/src/main/java/xpra/protocol/PictureEncoding.java
// public enum PictureEncoding {
//     rgb24,
//     rgb32,
//     premult_argb32,
//     jpeg,
//     png,
//     pngP("png/P"),
//     pngL("png/L");
// 
//     private static final PictureEncoding[] values = values();
//     private final String code;
// 
//     PictureEncoding() {
//         code = name();
//     }
// 
//     PictureEncoding(String code) {
//         this.code = code;
//     }
// 
//     @Override
//     public String toString() {
//         return code;
//     }
// 
//     public static PictureEncoding decode(String code) {
//         for (PictureEncoding encoding : values) {
//             if (encoding.code.equals(code)) {
//                 return encoding;
//             }
//         }
//         throw new IllegalArgumentException("Unsupported picture encoding: " + code);
//     }
// 
//     public static String[] toString(PictureEncoding[] encodings) {
//         final String[] array = new String[encodings.length];
//         for (int i = 0; i < encodings.length; ++i) {
//             array[i] = encodings[i].toString();
//         }
//         return array;
//     }
// 
// }
// 
// Path: xpra-common/src/main/java/xpra/protocol/ProtocolConstants.java
// public class ProtocolConstants {
// 
// 	public static final String VERSION = "0.15.0";
// 	public static final String MIN_VERSION = "0.5";
// }


import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import xpra.client.XpraKeyboard;
import xpra.client.XpraKeyboard.KeyDesc;
import xpra.protocol.PictureEncoding;
import xpra.protocol.ProtocolConstants;
			}
		}
		caps.put("platform", System.getProperty("os.name").toLowerCase());
		caps.put("uuid", UUID.randomUUID().toString().replace("-", ""));

		// it is required, if client wants to display windows (since 4.x)
		caps.put("windows", true);

		setKeyboard(keyboard);
	}

	public void setDpi(int dpi, int xdpi, int ydpi) {
		caps.put("dpi", dpi);		
//		caps.put("dpi.x", xdpi);		
//		caps.put("dpi.y", ydpi);		
	}

	private void setKeyboard(XpraKeyboard keyboard) {
		if (keyboard != null) {
			caps.put("keyboard", true);
			caps.put("keyboard_sync", false);
			caps.put("xkbmap_layout", keyboard.getLocale().getLanguage());
			caps.put("xkbmap_variant", keyboard.getLocale().getVariant());
			caps.put("xkbmap_keycodes", buildKeycodes(keyboard.getKeycodes()));
		} else {
			caps.put("keyboard", false);
			caps.put("keyboard_sync", false);
		}
	}

// Path: xpra-common/src/main/java/xpra/client/XpraKeyboard.java
// public interface XpraKeyboard {
// 
//     Locale getLocale();
// 
//     List<KeyDesc> getKeycodes();
// 
//     /**
//      * Key descriptor.
//      */
//     class KeyDesc {
// 
//         int keyval;
//         String keyname = "";
//         int keycode;
//         int group;
//         int level;
// 
//         public KeyDesc(int keycode, String keyname) {
//             this.keyval = keycode;
//             this.keycode = keycode;
//             this.keyname = keyname;
//         }
// 
//         public List<Object> toList() {
//             final List<Object> list = new ArrayList<>(5);
//             list.add(keyval);
//             list.add(keyname);
//             list.add(keycode);
//             list.add(group);
//             list.add(level);
//             return list;
//         }
// 
//         @Override
//         public String toString() {
//             return getClass().getSimpleName() + "( " + keycode + ", " + keyname + ")";
//         }
//     }
// }
// 
// Path: xpra-common/src/main/java/xpra/client/XpraKeyboard.java
// class KeyDesc {
// 
//     int keyval;
//     String keyname = "";
//     int keycode;
//     int group;
//     int level;
// 
//     public KeyDesc(int keycode, String keyname) {
//         this.keyval = keycode;
//         this.keycode = keycode;
//         this.keyname = keyname;
//     }
// 
//     public List<Object> toList() {
//         final List<Object> list = new ArrayList<>(5);
//         list.add(keyval);
//         list.add(keyname);
//         list.add(keycode);
//         list.add(group);
//         list.add(level);
//         return list;
//     }
// 
//     @Override
//     public String toString() {
//         return getClass().getSimpleName() + "( " + keycode + ", " + keyname + ")";
//     }
// }
// 
// Path: xpra-common/src/main/java/xpra/protocol/PictureEncoding.java
// public enum PictureEncoding {
//     rgb24,
//     rgb32,
//     premult_argb32,
//     jpeg,
//     png,
//     pngP("png/P"),
//     pngL("png/L");
// 
//     private static final PictureEncoding[] values = values();
//     private final String code;
// 
//     PictureEncoding() {
//         code = name();
//     }
// 
//     PictureEncoding(String code) {
//         this.code = code;
//     }
// 
//     @Override
//     public String toString() {
//         return code;
//     }
// 
//     public static PictureEncoding decode(String code) {
//         for (PictureEncoding encoding : values) {
//             if (encoding.code.equals(code)) {
//                 return encoding;
//             }
//         }
//         throw new IllegalArgumentException("Unsupported picture encoding: " + code);
//     }
// 
//     public static String[] toString(PictureEncoding[] encodings) {
//         final String[] array = new String[encodings.length];
//         for (int i = 0; i < encodings.length; ++i) {
//             array[i] = encodings[i].toString();
//         }
//         return array;
//     }
// 
// }
// 
// Path: xpra-common/src/main/java/xpra/protocol/ProtocolConstants.java
// public class ProtocolConstants {
// 
// 	public static final String VERSION = "0.15.0";
// 	public static final String MIN_VERSION = "0.5";
// }


// Path: xpra-common/src/main/java/xpra/protocol/packets/HelloRequest.java
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import xpra.client.XpraKeyboard;
import xpra.client.XpraKeyboard.KeyDesc;
import xpra.protocol.PictureEncoding;
import xpra.protocol.ProtocolConstants;

			}
		}
		caps.put("platform", System.getProperty("os.name").toLowerCase());
		caps.put("uuid", UUID.randomUUID().toString().replace("-", ""));

		// it is required, if client wants to display windows (since 4.x)
		caps.put("windows", true);

		setKeyboard(keyboard);
	}

	public void setDpi(int dpi, int xdpi, int ydpi) {
		caps.put("dpi", dpi);		
//		caps.put("dpi.x", xdpi);		
//		caps.put("dpi.y", ydpi);		
	}

	private void setKeyboard(XpraKeyboard keyboard) {
		if (keyboard != null) {
			caps.put("keyboard", true);
			caps.put("keyboard_sync", false);
			caps.put("xkbmap_layout", keyboard.getLocale().getLanguage());
			caps.put("xkbmap_variant", keyboard.getLocale().getVariant());
			caps.put("xkbmap_keycodes", buildKeycodes(keyboard.getKeycodes()));
		} else {
			caps.put("keyboard", false);
			caps.put("keyboard_sync", false);
		}
	}

	private Object buildKeycodes(List<KeyDesc> keycodes) {