LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBRdWFsY29tbSBBdGhlcm9zIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCiAqLwojaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX0FQSV9IICkKI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9BUElfSAoKLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIAogIFxmaWxlICB3bGFuX3FjdF9wYWxfYXBpLmgKICAKICBcYnJpZWYgZGVmaW5lIGdlbmVyYWwgQVBJcyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCiAgICAgICAgICAgICAgIAogICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQKICAKICAgQ29weXJpZ2h0IDIwMTAgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAKICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KICAKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCiNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCgojaWZkZWYgTUVNT1JZX0RFQlVHCiNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCiNlbmRpZiAvKiBNRU1PUllfREVCVUcgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipNQUNSTyoqKioqKioqKioqKioqKioqKioqKiovCgovLyBtYWNybyB0byBnZXQgbWF4aW11bSBvZiB0d28gdmFsdWVzLgojZGVmaW5lIFdQQUxfTUFYKCBfeCwgX3kgKSAoICggKF94KSA+IChfeSkgKSA/IChfeCkgOiAoX3kpICkgIAoKLy8gbWFjcm8gdG8gZ2V0IG1pbmltdW0gb2YgdHdvIHZhbHVlcwojZGVmaW5lIFdQQUxfTUlOKCBfeCwgX3kgKSAoICggKF94KSA8IChfeSkgKSA/IChfeCkgOiAoX3kpICApICAKCi8vIG1hY3JvIHRvIGdldCB0aGUgY2VpbGluZyBvZiBhbiBpbnRlZ2VyIGRpdmlzaW9uIG9wZXJhdGlvbi4uLgojZGVmaW5lIFdQQUxfQ0VJTF9ESVYoIF9hLCBfYiApICgoIDAgIT0gKF9hKSAlIChfYikgKSA/ICggKF9hKSAvIChfYikgKyAxICkgOiAoIChfYSkgLyAoX2IpICkpCgovLyBtYWNybyB0byByZXR1cm4gdGhlIGZsb29yIG9mIGFuIGludGVnZXIgZGl2aXNpb24gb3BlcmF0aW9uCiNkZWZpbmUgV1BBTF9GTE9PUl9ESVYoIF9hLCBfYiApICggKCAoX2EpIC0gKCAoX2EpICUgKF9iKSApICkgLyAoX2IpICkKCiNkZWZpbmUgV1BBTF9TV0FQX1UxNihfeCkgXAogICAoICggKCAoX3gpIDw8IDggKSAmIDB4RkYwMCApIHwgKCAoIChfeCkgPj4gOCApICYgMHgwMEZGICkgKQoKI2RlZmluZSBXUEFMX1NXQVBfVTMyKF94KSBcCiAgKCggKCAoIChfeCkgPDwgMjQgKSAmIDB4RkYwMDAwMDAgKSB8ICggKCAoX3gpID4+IDI0ICkgJiAweDAwMDAwMEZGICkgKSB8IFwKICAgKCAoICggKF94KSA8PCA4ICkgJiAweDAwRkYwMDAwICkgfCAoICggKF94KSA+PiA4ICkgJiAweDAwMDBGRjAwICkgKSkKCi8vIEVuZGlhbiBvcGVyYXRpb25zIGZvciBCaWcgRW5kaWFuIGFuZCBTbWFsbCBFbmRpYW4gbW9kZXMKI2lmbmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCgovL1RoaXMgcG9ydGlvbiBpcyBmb3IgbGl0dGxlLWVuZGlhbiBjcHUKI2RlZmluZSBXUEFMX0NQVV9UT19CRTMyKF94KSBXUEFMX1NXQVBfVTMyKF94KQojZGVmaW5lIFdQQUxfQkUzMl9UT19DUFUoX3gpIFdQQUxfU1dBUF9VMzIoX3gpCiNkZWZpbmUgV1BBTF9DUFVfVE9fQkUxNihfeCkgV1BBTF9TV0FQX1UxNihfeCkKI2RlZmluZSBXUEFMX0JFMTZfVE9fQ1BVKF94KSBXUEFMX1NXQVBfVTE2KF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0xFMzIoX3gpIChfeCkKI2RlZmluZSBXUEFMX0xFMzJfVE9fQ1BVKF94KSAoX3gpCiNkZWZpbmUgV1BBTF9DUFVfVE9fTEUxNihfeCkgKF94KQojZGVmaW5lIFdQQUxfTEUxNl9UT19DUFUoX3gpIChfeCkKCiNlbHNlIC8vI2lmbmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCgovL1RoaXMgcG9ydGlvbiBpcyBmb3IgYmlnLWVuZGlhbiBjcHUKI2RlZmluZSBXUEFMX0NQVV9UT19CRTMyKF94KSAoX3gpCiNkZWZpbmUgV1BBTF9CRTMyX1RPX0NQVShfeCkgKF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0JFMTYoX3gpIChfeCkKI2RlZmluZSBXUEFMX0JFMTZfVE9fQ1BVKF94KSAoX3gpCiNkZWZpbmUgV1BBTF9DUFVfVE9fTEUzMihfeCkgV1BBTF9TV0FQX1UzMihfeCkKI2RlZmluZSBXUEFMX0xFMzJfVE9fQ1BVKF94KSBXUEFMX1NXQVBfVTMyKF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0xFMTYoX3gpIFdQQUxfU1dBUF9VMTYoX3gpCiNkZWZpbmUgV1BBTF9MRTE2X1RPX0NQVShfeCkgV1BBTF9TV0FQX1UxNihfeCkKCiNlbmRpZiAvLyNpZm5kZWYgQU5JX0JJR19CWVRFX0VORElBTgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipHZW5lcmljIEFQSSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsT3BlbiAtICBJbml0aWFsaXplIFBBTAogICAgUGFyYW06IAogICAgICAgcHBQYWxDb250ZXh0IJYgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgcG9pbnRlci4gSXQgaXMgb3BhcXVlIHRvIGNhbGxlci4KICAgICAgICAgICAgICAgICAgICAgIENhbGxlciBzYXZlIHRoZSByZXR1cm5lZCBwb2ludGVyIGZvciBmdXR1cmUgdXNlIHdoZW4gY2FsbGluZwogICAgICAgICAgICAgICAgICAgICAgUEFMIEFQSXMuIElmIHRoaXMgaXMgTlVMTCwgaXQgbWVhbnMgdGhhdCBQQUwgZG9lc24ndCBuZWVkIGl0LgogICAgICAgcE9TQ29udGV4dCAtIFBvaW50ZXIgdG8gYSBjb250ZXh0IHRoYXQgaXMgT1Mgc3BlY2lmaWMuIFRoaXMgaXMgTlVMTCBpcyBhIAogICAgICAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyIFBBTCBkb2Vzbid0IHVzZSBpdCBmb3IgdGhhdCBPUy4KICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxPcGVuKHZvaWQgKipwcFBhbENvbnRleHQsIHZvaWQgKnBPU0NvbnRleHQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxDbG9zZSAtIFJlbGVhc2UgUEFMCiAgICBQYXJhbTogCiAgICAgICBwUGFsQ29udGV4dCCWIHBvaW50ZXIgcmV0dXJuZWQgZnJvbSB3cGFsT3Blbi4KICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxDbG9zZSh2b2lkICpwUGFsQ29udGV4dCk7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKk1lbW9yeSBBUEkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmZGVmIE1FTU9SWV9ERUJVRwovKiBGb3IgTWVtb3J5IERlYnVnZ2luZywgSG9vayB1cCBQQUwgbWVtb3J5IEFQSSB0byBWT1MgbWVtb3J5IEFQSSAqLwojZGVmaW5lIHdwYWxNZW1vcnlBbGxvY2F0ZSB2b3NfbWVtX21hbGxvYwojZGVmaW5lIHdwYWxNZW1vcnlGcmVlICAgICB2b3NfbWVtX2ZyZWUKI2Vsc2UKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsTWVtb3J5QWxsb2NhdGUgLSAgQWxsb2NhdGUgbWVtb3J5CiAgICBQYXJhbTogCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCiAgICBSZXR1cm46CiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuIAogICAgICAgTlVMTCCWIGZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgKndwYWxNZW1vcnlBbGxvY2F0ZSh3cHRfdWludDMyIHNpemUpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxNZW1vcnlGcmVlIC0gIEZyZWUgYWxsb2NhdGVkIG1lbW9yeQogICAgUGFyYW06IAogICAgICAgcHYgliBwb2ludGVyIHRvIGJ1ZmZlciB0byBiZSBmcmVlZAogICAgUmV0dXJuOgogICAgICAgTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxNZW1vcnlGcmVlKHZvaWQgKnB2KTsKI2VuZGlmIC8qIE1FTU9SWV9ERUJVRyAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxNZW1vcnlDb3B5IC0gIGNvcHkgbWVtb3J5CiAgICBQYXJhbTogCiAgICAgICBkZXN0IJYgYWRkcmVzcyB3aGljaCBkYXRhIGlzIGNvcGllZCB0bwogICAgICAgc3JjIJYgYWRkcmVzcyB3aGljaCBkYXRhIGlzIGNvcGllZCBmcm9tCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUwogICAgICAgZVdMQU5fUEFMX1NUQVRVU19JTlZBTElEX1BBUkFNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbE1lbW9yeUNvcHkodm9pZCAqIGRlc3QsIHZvaWQgKiBzcmMsIHdwdF91aW50MzIgc2l6ZSk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxNZW1vcnlDb21wYXJlIC0gIGNvbXBhcmUgbWVtb3J5CiAgICBQYXJhbTogCiAgICAgICBidWYxIJYgYWRkcmVzcyBvZiBidWZmZXIxCiAgICAgICBidWYyIJYgYWRkcmVzcyBvZiBidWZmZXIyCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9UUlVFIJYgaWYgdHdvIGJ1ZmZlcnMgaGF2ZSBzYW1lIGNvbnRlbnQKICAgICAgIGVXTEFOX1BBTF9GQUxTRSCWIG5vdCBtYXRjaAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfYm9vbGVhbiB3cGFsTWVtb3J5Q29tcGFyZSh2b2lkICogYnVmMSwgdm9pZCAqIGJ1ZjIsIHdwdF91aW50MzIgc2l6ZSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE1lbW9yeVplcm8gLSAgWmVybyBtZW1vcnkKICAgIFBhcmFtOiAKICAgICAgIGJ1ZiCWIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIGJlIHplcm8KICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gemVybwogICAgUmV0dXJuOgogICAgICAgTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxNZW1vcnlaZXJvKHZvaWQgKmJ1Ziwgd3B0X3VpbnQzMiBzaXplKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE1lbW9yeUZpbGwgLSAgRmlsbCBtZW1vcnkgd2l0aCBvbmUgcGF0dGVybgogICAgUGFyYW06IAogICAgICAgYnVmIJYgYWRkcmVzcyBvZiBidWZmZXIgdG8gYmUgemVybwogICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byB6ZXJvCiAgICAgICBiRmlsbCAtIG9uZSBieXRlIG9mIGRhdGEgdG8gZmlsbCBpbiAoc2l6ZSkgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcgogICAgUmV0dXJuOgogICAgICAgTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxNZW1vcnlGaWxsKHZvaWQgKmJ1Ziwgd3B0X3VpbnQzMiBzaXplLCB3cHRfYnl0ZSBiRmlsbCk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEbWFNZW1vcnlBbGxvY2F0ZSAtICBBbGxvY2F0ZSBtZW1vcnkgcmVhZHkgZm9yIERNQS4gQWxpZ25lZCBhdCA0LWJ5dGUKICAgIFBhcmFtOiAKICAgICAgIHBQYWxDb250ZXh0IC0gUEFMIGNvbnRleHQgcG9pbnRlcgogICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQogICAgICAgcHBQaHlzaWNhbEFkZHIgliBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaWYgYWxsb2NhdGlvbiBzdWNjZWVkcwogICAgUmV0dXJuOgogICAgICAgQSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh2aXJ0dWFsIGFkZHJlc3MpLiAKICAgICAgIE5VTEwgliBmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgKndwYWxEbWFNZW1vcnlBbGxvY2F0ZSh3cHRfdWludDMyIHNpemUsIHZvaWQgKipwcFBoeXNpY2FsQWRkcik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERtYU1lbW9yeUZyZWUgLSAgRnJlZSBtZW1vcnkgcmVhZHkgZm9yIERNQQogICAgUGFyYW06IAogICAgICAgcFBhbENvbnRleHQgLSBQQUwgY29udGV4dCBwb2ludGVyCiAgICAgICBwdiCWIGFkZHJlc3MgZm9yIHRoZSBidWZmZXIgdG8gYmUgZnJlZWQKICAgIFJldHVybjoKICAgICAgIE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsRG1hTWVtb3J5RnJlZSh2b2lkICpwdik7CgoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsRGJnUmVhZFJlZ2lzdGVyIC0gIFJlYWQgcmVnaXN0ZXIgZnJvbSB0aGUgV2lGaSBCQiBjaGlwCiAgICBQYXJhbTogCiAgICAgICByZWdBZGRyIC0gcmVnaXN0ZXIgYWRkcmVzcwogICAgICAgcHJlZ1ZhbHVlIC0gcmV0dXJuIHZhbHVlIGZyb20gcmVnaXN0ZXIgaWYgc3VjY2VzcwogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERiZ1JlYWRSZWdpc3Rlcih3cHRfdWludDMyIHJlZ0FkZHIsIHdwdF91aW50MzIgKnByZWdWYWx1ZSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERiZ1dyaXRlUmVnaXN0ZXIgLSAgV3JpdGUgYSB2YWx1ZSB0byB0aGUgcmVnaXN0ZXIgaW4gdGhlIFdpRmkgQkIgY2hpcAogICAgUGFyYW06IAogICAgICAgcmVnQWRkciAtIHJlZ2lzdGVyIGFkZHJlc3MKICAgICAgIHJlZ1ZhbHVlIC0gdmFsdWUgdG8gYmUgd3JpdHRlbgogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERiZ1dyaXRlUmVnaXN0ZXIod3B0X3VpbnQzMiByZWdBZGRyLCB3cHRfdWludDMyIHJlZ1ZhbHVlKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsRGJnUmVhZE1lbW9yeSAtICBSZWFkIG1lbW9yeSBmcm9tIFdpRmkgQkIgY2hpcCBzcGFjZQogICAgUGFyYW06IAogICAgICAgbWVtQWRkciAtIGFkZHJlc3Mgb2YgbWVtb3J5CiAgICAgICBidWYgLSBvdXRwdXQgCiAgICAgICBsZW4gLSBsZW5ndGggdG8gYmUgcmVhZAogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERiZ1JlYWRNZW1vcnkod3B0X3VpbnQzMiBtZW1BZGRyLCB3cHRfdWludDggKmJ1Ziwgd3B0X3VpbnQzMiBsZW4pOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEYmdXcml0ZU1lbW9yeSAtICBXcml0ZSBhIHZhbHVlIHRvIHRoZSBtZW1vcnkgaW4gdGhlIFdpRmkgQkIgY2hpcCBzcGFjZQogICAgUGFyYW06IAogICAgICAgbWVtQWRkciAtIG1lbW9yeSBhZGRyZXNzCiAgICAgICBidWYgLSB2bGF1ZSB0byBiZSB3cml0dGVuCiAgICAgICBsZW4gLSBsZW5ndGggb2YgYnVmCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRGJnV3JpdGVNZW1vcnkod3B0X3VpbnQzMiBtZW1BZGRyLCB3cHRfdWludDggKmJ1Ziwgd3B0X3VpbnQzMiBsZW4pOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEcml2ZXJTaHV0ZG93biAtICBTaHV0ZG93biBXTEFOIGRyaXZlcgoKICAgIFRoaXMgQVBJIGlzIHJlcXVpZWQgYnkgU1NSLCBjYWxsIGluIHRvICdWT1Mgc2h1dGRvd24nIHRvIHNodXRkb3duIFdMQU4gCiAgICBkcml2ZXIgd2hlbiBSaXZhIGNyYXNoZXMuCgogICAgUGFyYW06IAogICAgICAgTm9uZQogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERyaXZlclNodXRkb3duKHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEcml2ZXJTaHV0ZG93biAtICBSZS1pbml0IFdMQU4gZHJpdmVyCgogICAgVGhpcyBBUEkgaXMgcmVxdWllZCBieSBTU1IsIGNhbGwgaW4gdG8gJ1ZPUyByZS1pbml0JyB0byByZS1pbml0IFdMQU4KICAgIGRyaXZlci4KCiAgICBQYXJhbTogCiAgICAgICBOb25lCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRHJpdmVyUmVJbml0KHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxSaXZhU3VieXN0ZW1SZXN0YXJ0IC0gIEluaXRpYXRlIFJpdmEgU1NSCgogICAgVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IFdMQU4gZHJpdmVyIHRvIGluaXRpYXRlIFJpdmEgU1NSCgogICAgUGFyYW06CiAgICAgICBOb25lCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsUml2YVN1YnlzdGVtUmVzdGFydCh2b2lkKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsV2xhblJlbG9hZCAtICBJbml0aWF0ZSBXTEFOIERyaXZlciByZWxvYWQKCiAgICBQYXJhbToKICAgICAgIE5vbmUKICAgIFJldHVybjoKICAgICAgIE5PTkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsV2xhblJlbG9hZCh2b2lkKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsV2Nuc3NSZXNldEludHIgLSAgVHJpZ2dlciB0aGUgcmVzZXQgRklRIHRvIFJpdmEKCiAgICBQYXJhbToKICAgICAgIE5vbmUKICAgIFJldHVybjoKICAgICAgIE5PTkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsV2Nuc3NSZXNldEludHIodm9pZCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbEZ3RHVtcFJlcSAtICBUcmlnZ2VyIHRoZSBkdW1wIGNvbW1hbmRzIHRvIEZpcm13YXJlCgogICAgUGFyYW06CiAgICAgICBjbWQgLSBDb21tYW5kIE5vLiB0byBleGVjdXRlCiAgICAgICBhcmcxIC0gYXJndW1lbnQgMSB0byBjbWQKICAgICAgIGFyZzIgLSBhcmd1bWVudCAyIHRvIGNtZAogICAgICAgYXJnMyAtIGFyZ3VtZW50IDMgdG8gY21kCiAgICAgICBhcmc0IC0gYXJndW1lbnQgNCB0byBjbWQKICAgIFJldHVybjoKICAgICAgIE5PTkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsRndEdW1wUmVxKHdwdF91aW50MzIgY21kLCB3cHRfdWludDMyIGFyZzEsIHdwdF91aW50MzIgYXJnMiwKICAgICAgICAgICAgICAgICAgICB3cHRfdWludDMyIGFyZzMsIHdwdF91aW50MzIgYXJnNCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERldmljZVBhbmljIC0gIFRyaWdnZXIgRGV2aWNlIFBhbmljCiAgICAgICBUcmlnZ2VyIGRldmljZSBwYW5pYyB0byBoZWxwIGRlYnVnCgogICAgUGFyYW06CiAgICAgICBOT05FCgogICAgUmV0dXJuOgogICAgICAgTk9ORQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxEZXZpY2VQYW5pYyh2b2lkKTsKI2VuZGlmIC8vIF9fV0xBTl9RQ1RfUEFMX0FQSV9ICg==