LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBRdWFsY29tbSBBdGhlcm9zIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkuCiAqLwojaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX01TR19IICkKI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9NU0dfSAoKLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIAogIFxmaWxlICB3bGFuX3FjdF9wYWxfbXNnLmgKICAKICBcYnJpZWYgZGVmaW5lIGdlbmVyYWwgbWVzc2FnZSBBUElzIFBBTCBleHBvcnRzIHRvIHN1cHBvcnQgbGVnYWN5IFVNQUMuIAogICB3cHQgPSAoV2xhbiBQYWwgVHlwZSkgd3BhbCA9IChXbGFuIFBBTCkKICAgICAgICAgICAgICAgCiAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQuIE9ubHkgd29yayB3aXRoIGxlZ2FjeSBVTUFDLgogIAogICBDb3B5cmlnaHQgMjAxMCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIAogICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgogIAogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKCi8qIFJhbmRvbSBzaWduYXR1cmUgdG8gZGV0ZWN0IFNNRCBPUEVOIE5PVElGWSAqLwojZGVmaW5lIFdQQUxfTUNfTVNHX1NNRF9OT1RJRl9PUEVOX1NJRyAgIDB4MDlFMgoKLyogUmFuZG9tIHNpZ25hdHVyZSB0byBkZXRlY3QgU01EIERBVEEgTk9USUZZICovCiNkZWZpbmUgV1BBTF9NQ19NU0dfU01EX05PVElGX0RBVEFfU0lHICAgMHhEQTdBCgp0eXBlZGVmIHN0cnVjdCBzd3B0X21zZyB3cHRfbXNnOwoKdHlwZWRlZiB2b2lkICgqd3BhbF9tc2dfY2FsbGJhY2spKHdwdF9tc2cgKnBNc2cpOwoKc3RydWN0IHN3cHRfbXNnCnsKICAgd3B0X3VpbnQxNiB0eXBlOwogICB3cHRfdWludDE2IHJlc2VydmVkOwogICB2b2lkICpwdHI7CiAgIHdwdF91aW50MzIgdmFsOwogICB3cGFsX21zZ19jYWxsYmFjayBjYWxsYmFjazsKICAgdm9pZCAqcENvbnRleHQ7Cn07IAoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHdwYWxQb3N0Q3RybE1zZyCWIFBvc3QgYSBtZXNzYWdlIHRvIGNvbnRyb2wgY29udGV4dCBzbyBpdCBjYW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHByb2Nlc3NlZCBpbiB0aGF0IGNvbnRleHQuCiAgIFBhcmFtOiAKICAgICAgcFBhbENvbnRleHQgliBBIFBBTCBjb250ZXh0CiAgICAgIHBNc2cgliBhIHBvaW50ZXIgdG8gY2FsbGVkIGFsbG9jYXRlZCBvYmplY3Q7IENhbGxlciByZXRhaW4gdGhlIG93bmVyc2hpcCAKICAgICAgICAgICAgIGFmdGVyIHRoaXMgQVBJIHJldHVybnMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFBvc3RDdHJsTXNnKHZvaWQgKnBQYWxDb250ZXh0LCB3cHRfbXNnICpwTXNnKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICB3cGFsUG9zdFR4TXNnIJYgUG9zdCBhIG1lc3NhZ2UgdG8gVFggY29udGV4dCBzbyBpdCBjYW4gYmUgcHJvY2Vzc2VkIGluIHRoYXQgY29udGV4dC4KICAgUGFyYW06IAogICAgICBwUGFsQ29udGV4dCCWIEEgUEFMIGNvbnRleHQKICAgICAgcE1zZyCWIGEgcG9pbnRlciB0byBjYWxsZWQgYWxsb2NhdGVkIG9iamVjdDsgQ2FsbGVyIHJldGFpbiB0aGUgb3duZXJzaGlwIAogICAgICAgICAgICAgYWZ0ZXIgdGhpcyBBUEkgcmV0dXJucy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsUG9zdFR4TXNnKHZvaWQgKnBQYWxDb250ZXh0LCB3cHRfbXNnICpwTXNnKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHdwYWxQb3N0UnhNc2cgliBQb3N0IGEgbWVzc2FnZSB0byBSWCBjb250ZXh0IHNvIGl0IGNhbiBiZSBwcm9jZXNzZWQgaW4gdGhhdCBjb250ZXh0LgogICBQYXJhbTogCiAgICAgIHBQYWxDb250ZXh0IJYgQSBQQUwgY29udGV4dAogICAgICBwTXNnIJYgYSBwb2ludGVyIHRvIGNhbGxlZCBhbGxvY2F0ZWQgb2JqZWN0OyBDYWxsZXIgcmV0YWluIHRoZSBvd25lcnNoaXAgCiAgICAgICAgICAgICBhZnRlciB0aGlzIEFQSSByZXR1cm5zLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxQb3N0UnhNc2codm9pZCAqcFBhbENvbnRleHQsIHdwdF9tc2cgKnBNc2cpOwoKCgojZW5kaWYgLy8gX19XTEFOX1FDVF9QQUxfQVBJX0gK