LyoKICogWE1TIHYyKyBlbXVsYXRpb24KICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgWE1TIGVtdWxhdGlvbiBpcyBob29rZWQgdGhyb3VnaCB0aGUgRFBNSSBpbnRlcnJ1cHQuCiAqLwoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5kb3dzLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgInRvb2xoZWxwLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAic2VsZWN0b3JzLmgiCgp0eXBlZGVmIHN0cnVjdCB7CiBXT1JEIEhhbmRsZTsKIERXT1JEIE9mZnNldDsKfSBXSU5FX1BBQ0tFRCBNT1ZFT0ZTOwoKdHlwZWRlZiBzdHJ1Y3QgewogRFdPUkQgTGVuZ3RoOwogTU9WRU9GUyBTb3VyY2U7CiBNT1ZFT0ZTIERlc3Q7Cn0gV0lORV9QQUNLRUQgTU9WRVNUUlVDVDsKCnN0YXRpYyBCWVRFICogWE1TX09mZnNldCggTU9WRU9GUyAqb2ZzICkKewogICAgaWYgKG9mcy0+SGFuZGxlKSByZXR1cm4gKEJZVEUqKUdsb2JhbExvY2sxNihvZnMtPkhhbmRsZSkrb2ZzLT5PZmZzZXQ7CiAgICAgICAgZWxzZSByZXR1cm4gKEJZVEUqKURPU01FTV9NYXBSZWFsVG9MaW5lYXIob2ZzLT5PZmZzZXQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkgICAgWE1TX0hhbmRsZXIKICovCgp2b2lkIFdJTkFQSSBYTVNfSGFuZGxlciggQ09OVEVYVCAqY29udGV4dCApCnsKICAgIHN3aXRjaChBSF9yZWcoY29udGV4dCkpCiAgICB7CiAgICBjYXNlIDB4MDA6ICAgLyogR2V0IFhNUyB2ZXJzaW9uIG51bWJlciAqLwogICAgICAgIFRSQUNFKGludDMxLCAiZ2V0IFhNUyB2ZXJzaW9uIG51bWJlclxuIik7CiAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMjAwOyAvKiAyLjAgKi8KICAgICAgICBCWF9yZWcoY29udGV4dCkgPSAweDAwMDA7IC8qIGludGVybmFsIHJldmlzaW9uICovCiAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gMHgwMDAxOyAvKiBITUEgZXhpc3RzICovCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MDg6ICAgLyogUXVlcnkgRnJlZSBFeHRlbmRlZCBNZW1vcnkgKi8KICAgIHsKCU1FTU1BTklORk8gbW1pOwoKICAgICAgICBUUkFDRShpbnQzMSwgInF1ZXJ5IGZyZWUgZXh0ZW5kZWQgbWVtb3J5XG4iKTsKCW1taS5kd1NpemUgPSBzaXplb2YobW1pKTsKCU1lbU1hbkluZm8oJm1taSk7CglBWF9yZWcoY29udGV4dCkgPSBtbWkuZHdGcmVlUGFnZXM+PjEwOwoJRFhfcmVnKGNvbnRleHQpID0gbW1pLmR3TGFyZ2VzdEZyZWVCbG9jaz4+MTA7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIDB4MDk6ICAgLyogQWxsb2NhdGUgRXh0ZW5kZWQgTWVtb3J5IEJsb2NrICovCiAgICAgICAgVFJBQ0UoaW50MzEsICJhbGxvY2F0ZSBleHRlbmRlZCBtZW1vcnkgYmxvY2sgKCVkSylcbiIsCiAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSk7CglEWF9yZWcoY29udGV4dCkgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsCgkgICAgKERXT1JEKURYX3JlZyhjb250ZXh0KTw8MTApOwoJQVhfcmVnKGNvbnRleHQpID0gRFhfcmVnKGNvbnRleHQpID8gMSA6IDA7CglpZiAoIURYX3JlZyhjb250ZXh0KSkgQkxfcmVnKGNvbnRleHQpID0gMHhBMDsgLyogb3V0IG9mIG1lbW9yeSAqLwoJYnJlYWs7CiAgICBjYXNlIDB4MGE6ICAgLyogRnJlZSBFeHRlbmRlZCBNZW1vcnkgQmxvY2sgKi8KCVRSQUNFKGludDMxLCAiZnJlZSBleHRlbmRlZCBtZW1vcnkgYmxvY2sgJTA0eFxuIixEWF9yZWcoY29udGV4dCkpOwoJR2xvYmFsRnJlZTE2KERYX3JlZyhjb250ZXh0KSk7CglicmVhazsKICAgIGNhc2UgMHgwYjogICAvKiBNb3ZlIEV4dGVuZGVkIE1lbW9yeSBCbG9jayAqLwogICAgewoJTU9WRVNUUlVDVCptb3ZlPUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LAoJICAgIERTX3JlZyhjb250ZXh0KSxFU0lfcmVnKGNvbnRleHQpKTsKICAgICAgICBCWVRFKnNyYywqZHN0OwogICAgICAgIFRSQUNFKGludDMxLCAibW92ZSBleHRlbmRlZCBtZW1vcnkgYmxvY2tcbiIpOwogICAgICAgIHNyYz1YTVNfT2Zmc2V0KCZtb3ZlLT5Tb3VyY2UpOwogICAgICAgIGRzdD1YTVNfT2Zmc2V0KCZtb3ZlLT5EZXN0KTsKCW1lbWNweShkc3Qsc3JjLG1vdmUtPkxlbmd0aCk7CglpZiAobW92ZS0+U291cmNlLkhhbmRsZSkgR2xvYmFsVW5sb2NrMTYobW92ZS0+U291cmNlLkhhbmRsZSk7CglpZiAobW92ZS0+RGVzdC5IYW5kbGUpIEdsb2JhbFVubG9jazE2KG1vdmUtPkRlc3QuSGFuZGxlKTsKCWJyZWFrOwogICAgfQogICAgZGVmYXVsdDoKICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgzMSApOwogICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDAwMDsgLyogZmFpbHVyZSAqLwogICAgICAgIEJMX3JlZyhjb250ZXh0KSA9IDB4ODA7ICAgLyogZnVuY3Rpb24gbm90IGltcGxlbWVudGVkICovCiAgICAgICAgYnJlYWs7CiAgICB9Cn0K