// Path: javax.usb-extra/src/main/java/javax/usb/extra/ExtraUsbUtil.java
// public class ExtraUsbUtil {
//     /**
//      * @param a Least significant byte
//      * @param b Most significant byte
//      */
//     public static short toShort(byte a, byte b) {
//         return (short)(b << 8 | a);
//     }
// 
//     /**
//      * @param a Least significant byte
//      * @param b
//      * @param c
//      * @param d Most significant byte
//      * @return
//      */
//     public static int toInt(byte a, byte b, byte c, byte d) {
//         return d << 24 | c << 16 | b << 8 | a;
//     }
// 
//     public static boolean isUsbDevice(UsbDeviceDescriptor descriptor, short idVendor, short idProduct) {
//         return descriptor.idVendor() == idVendor && descriptor.idProduct() == idProduct;
//     }
// 
//     public static UsbDevice findUsbDevice(UsbHub usbHub, short idVendor, short idProduct) {
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (device.isUsbHub()) {
//                 continue;
//             }
// 
//             UsbDeviceDescriptor deviceDescriptor = device.getUsbDeviceDescriptor();
// 
//             if (isUsbDevice(deviceDescriptor, idVendor, idProduct)) {
//                 return device;
//             }
//         }
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (!device.isUsbHub()) {
//                 continue;
//             }
// 
//             UsbDevice foundDevice = findUsbDevice((UsbHub) device, idVendor, idProduct);
// 
//             if (foundDevice != null) {
//                 return foundDevice;
//             }
//         }
// 
//         return null;
//     }
// 
//     public static List<UsbDevice> findUsbDevices(UsbHub usbHub, short idVendor, short idProduct) {
//         List<UsbDevice> devices = new ArrayList<UsbDevice>();
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (device.isUsbHub()) {
//                 continue;
//             }
// 
//             UsbDeviceDescriptor deviceDescriptor = device.getUsbDeviceDescriptor();
// 
//             if (deviceDescriptor.idVendor() == idVendor && deviceDescriptor.idProduct() == idProduct) {
//                 devices.add(device);
//             }
//         }
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (!device.isUsbHub()) {
//                 continue;
//             }
// 
//             List<UsbDevice> foundDevices = findUsbDevices((UsbHub) device, idVendor, idProduct);
// 
//             devices.addAll(foundDevices);
//         }
// 
//         return devices;
//     }
// 
//     public static List<UsbDevice> listUsbDevices(UsbHub usbHub) {
//         List<UsbDevice> devices = new ArrayList<UsbDevice>();
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (device.isUsbHub()) {
//                 continue;
//             }
// 
//             devices.add(device);
//         }
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (!device.isUsbHub()) {
//                 continue;
//             }
// 
//             devices.addAll(listUsbDevices(usbHub));
//         }
// 
//         return devices;
//     }
// 
//     public static String deviceIdToString(UsbDeviceDescriptor descriptor) {
//         return toHexString(descriptor.idVendor()) + ":" + toHexString(descriptor.idProduct());
//     }
// 
//     public static String deviceIdToString(short idVendor, short idProduct) {
//         return toHexString(idVendor) + ":" + toHexString(idProduct);
//     }
// }
// 
// Path: javax.usb/src/main/java/javax/usb/util/UsbUtil.java
// public static String toHexString(byte b) {
//     int i = unsignedInt(b);
//     return new String(new char[]{
//         hexDigits[i >> 4],
//         hexDigits[i & 0x0f],
//     });
// }


import static java.lang.Integer.*;
import static javax.usb.extra.ExtraUsbUtil.*;
import static javax.usb.util.UsbUtil.toHexString;
import javax.usb.*;
import java.util.*;
                System.err.println("'id' parameter is out of range.");
                return null;
            }

            return devices.get(index);
        } else if (idProduct != null && idVendor != null) {
            UsbDevice usbDevice = findUsbDevice(hub, idVendor, idProduct);

            if (usbDevice == null) {
                System.err.println("Could not find device with id " + deviceIdToString(idVendor, idProduct) + ".");
            }

            return usbDevice;
        }
        return null;
    }

    public static void listDevices(UsbHub hub, short idVendor, short idProduct) {
        listDevices("0", hub, idVendor, idProduct);
    }

    private static void listDevices(String prefix, UsbHub hub, short idVendor, short idProduct) {
        List<UsbDevice> list = hub.getAttachedUsbDevices();
        for (int i = 0; i < list.size(); i++) {
            UsbDevice device = list.get(i);
            if (device.isUsbHub()) {
                listDevices(prefix + "." + i, (UsbHub) device, idVendor, idProduct);
            } else {
                UsbDeviceDescriptor deviceDescriptor = device.getUsbDeviceDescriptor();

// Path: javax.usb-extra/src/main/java/javax/usb/extra/ExtraUsbUtil.java
// public class ExtraUsbUtil {
//     /**
//      * @param a Least significant byte
//      * @param b Most significant byte
//      */
//     public static short toShort(byte a, byte b) {
//         return (short)(b << 8 | a);
//     }
// 
//     /**
//      * @param a Least significant byte
//      * @param b
//      * @param c
//      * @param d Most significant byte
//      * @return
//      */
//     public static int toInt(byte a, byte b, byte c, byte d) {
//         return d << 24 | c << 16 | b << 8 | a;
//     }
// 
//     public static boolean isUsbDevice(UsbDeviceDescriptor descriptor, short idVendor, short idProduct) {
//         return descriptor.idVendor() == idVendor && descriptor.idProduct() == idProduct;
//     }
// 
//     public static UsbDevice findUsbDevice(UsbHub usbHub, short idVendor, short idProduct) {
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (device.isUsbHub()) {
//                 continue;
//             }
// 
//             UsbDeviceDescriptor deviceDescriptor = device.getUsbDeviceDescriptor();
// 
//             if (isUsbDevice(deviceDescriptor, idVendor, idProduct)) {
//                 return device;
//             }
//         }
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (!device.isUsbHub()) {
//                 continue;
//             }
// 
//             UsbDevice foundDevice = findUsbDevice((UsbHub) device, idVendor, idProduct);
// 
//             if (foundDevice != null) {
//                 return foundDevice;
//             }
//         }
// 
//         return null;
//     }
// 
//     public static List<UsbDevice> findUsbDevices(UsbHub usbHub, short idVendor, short idProduct) {
//         List<UsbDevice> devices = new ArrayList<UsbDevice>();
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (device.isUsbHub()) {
//                 continue;
//             }
// 
//             UsbDeviceDescriptor deviceDescriptor = device.getUsbDeviceDescriptor();
// 
//             if (deviceDescriptor.idVendor() == idVendor && deviceDescriptor.idProduct() == idProduct) {
//                 devices.add(device);
//             }
//         }
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (!device.isUsbHub()) {
//                 continue;
//             }
// 
//             List<UsbDevice> foundDevices = findUsbDevices((UsbHub) device, idVendor, idProduct);
// 
//             devices.addAll(foundDevices);
//         }
// 
//         return devices;
//     }
// 
//     public static List<UsbDevice> listUsbDevices(UsbHub usbHub) {
//         List<UsbDevice> devices = new ArrayList<UsbDevice>();
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (device.isUsbHub()) {
//                 continue;
//             }
// 
//             devices.add(device);
//         }
// 
//         for (UsbDevice device : usbHub.getAttachedUsbDevices()) {
//             if (!device.isUsbHub()) {
//                 continue;
//             }
// 
//             devices.addAll(listUsbDevices(usbHub));
//         }
// 
//         return devices;
//     }
// 
//     public static String deviceIdToString(UsbDeviceDescriptor descriptor) {
//         return toHexString(descriptor.idVendor()) + ":" + toHexString(descriptor.idProduct());
//     }
// 
//     public static String deviceIdToString(short idVendor, short idProduct) {
//         return toHexString(idVendor) + ":" + toHexString(idProduct);
//     }
// }
// 
// Path: javax.usb/src/main/java/javax/usb/util/UsbUtil.java
// public static String toHexString(byte b) {
//     int i = unsignedInt(b);
//     return new String(new char[]{
//         hexDigits[i >> 4],
//         hexDigits[i & 0x0f],
//     });
// }


// Path: usbtools/src/main/java/io/trygvis/usb/tools/UsbCliUtil.java
import static java.lang.Integer.*;
import static javax.usb.extra.ExtraUsbUtil.*;
import static javax.usb.util.UsbUtil.toHexString;
import javax.usb.*;
import java.util.*;

                System.err.println("'id' parameter is out of range.");
                return null;
            }

            return devices.get(index);
        } else if (idProduct != null && idVendor != null) {
            UsbDevice usbDevice = findUsbDevice(hub, idVendor, idProduct);

            if (usbDevice == null) {
                System.err.println("Could not find device with id " + deviceIdToString(idVendor, idProduct) + ".");
            }

            return usbDevice;
        }
        return null;
    }

    public static void listDevices(UsbHub hub, short idVendor, short idProduct) {
        listDevices("0", hub, idVendor, idProduct);
    }

    private static void listDevices(String prefix, UsbHub hub, short idVendor, short idProduct) {
        List<UsbDevice> list = hub.getAttachedUsbDevices();
        for (int i = 0; i < list.size(); i++) {
            UsbDevice device = list.get(i);
            if (device.isUsbHub()) {
                listDevices(prefix + "." + i, (UsbHub) device, idVendor, idProduct);
            } else {
                UsbDeviceDescriptor deviceDescriptor = device.getUsbDeviceDescriptor();

                System.err.print(prefix + "." + i + " " + toHexString(deviceDescriptor.idVendor()) + ":" + toHexString(deviceDescriptor.idProduct()));